﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Unimaq.FacturaDBS_Spring.LogicaNegocio.Version2.DBS
{
    public class DBS_DetalleBLL
    {
        #region Metodos Auxiliares
        public string getTipoComprobante(string tipoDocumento)
        {
            string result = string.Empty;

            switch (tipoDocumento.Trim())
            {
                case "FA":
                case "fa":
                    result = "FA";
                    break;
                case "BO":
                case "bo":
                    result = "BV";
                    break;
                case "NA":
                case "na":
                    result = "NC";
                    break;
                case "NC":
                case "nc":
                    result = "ND";
                    break;
            }

            return result;
        }

        public string convertMoneda(string value)
        {
            string result = string.Empty;

            switch (value.Trim())
            {
                case "D":
                case "d":
                    result = "EX";
                    break;
                case "N":
                case "n":
                    result = "LO";
                    break;
            }

            return result;
        }

        public string getSucursal(decimal value)
        {
            string result = string.Empty;

            int val = Convert.ToInt32(value);

            switch (val)
            {
                case 0:
                case 1:
                case 2:
                    result = "LIMA";
                    break;
                case 18:
                case 20:
                    result = "HYO";
                    break;
                case 30:
                    result = "PIUR";
                    break;
                case 40:
                    result = "LAMB";
                    break;
                case 45:
                    result = "CAJA";
                    break;
                case 55:
                    result = "TRUJ";
                    break;
                case 60:
                    result = "AREQ";
                    break;
                case 61:
                    result = "ILO";
                    break;
                case 65:
                    result = "CUZC";
                    break;
                default:
                    result = string.Empty;
                    break;
            }

            return result;
        }
        #endregion

        public List<Entidades.Version2.DBS.DBS_Detalle> Listar_AS400(DateTime fechaEmisionInicio, DateTime fechaEmisionFin)
        {
            ADO.Version2.DBS.DBS_DetalleADO dbs_DetalleADO = new ADO.Version2.DBS.DBS_DetalleADO();

            using (Util.ContextoDBAS400 ctx = Util.ContextoDBAS400.GetContexto())
            {
                return dbs_DetalleADO.Listar_Detalle_AS400(ctx, fechaEmisionInicio, fechaEmisionFin);
            }
        }

        #region UH - ALQUILER
        public List<Entidades.Version2.DBS.DBS_Detalle> Listar_UH_FAMA_AS400(List<Entidades.Version2.DBS.DBS_Detalle> lista)
        {
            return lista.Where(x =>
                x.Cencos.Trim() == "UH" &&
                x.Numori.StartsWith("FAMA") &&
                x.Numsec > 10 &&
                x.Accion.Trim() == "00" &&
                x.Encode.Trim() != "GLOSA").ToList();
        }

        public List<Entidades.Version2.DBS.DBS_Detalle> Listar_UH_NOFAMA_AS400(List<Entidades.Version2.DBS.DBS_Detalle> lista)
        {
            return lista.Where(x =>
                (x.Cencos.Trim() == "UH" || x.Cencos.Trim() == "UA") &&
                !x.Numori.StartsWith("FAMA") &&
                x.Numsec > 19 &&
                x.Accion.Trim() == "00").ToList();
        }

        public List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> UH_ConvertTo_Spring(List<Entidades.Version2.DBS.DBS_Detalle> lista)
        {
            List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> result = new List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase>();

            string qTipreg = "-1";
            decimal qCorp = -1m;
            decimal qCia = -1m;
            decimal qOfic = -1m;
            decimal qAnodoc = -1m;
            string qTipdoc = "-1";
            string qNumori = "-1";
            int qNumpag = -1;

            int lineaValue = 0;

            foreach (Entidades.Version2.DBS.DBS_Detalle l in lista)
            {
                Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase detalle = new Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase();

                if (
                    qTipreg.Trim() != l.Tipreg.Trim() ||
                    qCorp != l.Corp.Value ||
                    qCia != l.Cia.Value ||
                    qOfic != l.Ofic ||
                    qAnodoc != l.Anodoc.Value ||
                    qTipdoc.Trim() != l.Tipdoc.Trim() ||
                    qNumori.Trim() != l.Numori.Trim() ||
                    qNumpag != l.Numpag)
                {
                    lineaValue = 1;
                }

                detalle.TipoComprobante = getTipoComprobante(l.Suntip.Trim());
                detalle.SerieComprobante = l.Sunpre.ToString().Trim();
                detalle.NumeroComprobante = l.Sunnum.ToString().Trim();
                detalle.TipoComponente = "C";
                detalle.Linea = lineaValue;
                detalle.Componente = !string.IsNullOrWhiteSpace(l.Ecode1) ? l.Ecode1.Trim().Substring(0, 4) : !string.IsNullOrWhiteSpace(l.Ecode2) ? l.Ecode2.Trim().Substring(0, 4) : !string.IsNullOrWhiteSpace(l.Ecode3) ? l.Ecode3.Trim().Substring(0, 4) : string.Empty;
                detalle.Nombre = l.Linead.Trim();
                detalle.Cantidad = 1;
                detalle.Sucursal = getSucursal(l.Ofic);
                detalle.Moneda = convertMoneda(l.Moneda);
                detalle.TipoCambio = l.Tipcam;
                detalle.PrecioUnitario = lineaValue == 1 ? l.Suntip.Trim() == "NC" ? l.Vavta1 : l.Valaf16 : new decimal(0);
                detalle.MontoAfecto = lineaValue == 1 ? l.Suntip.Trim() == "NC" ? l.Vavta1 : l.Valaf16 : new decimal(0);
                detalle.MontoImpuestoVentas = lineaValue == 1 ? l.Impor16 : new decimal(0);
                detalle.ConceptoGasto = "999";
                detalle.EstadoCarga = "PE";
                detalle.Estado = "PE";
                detalle.CentroCosto = l.Cencos.Trim() == "UA" ? "UH" : l.Cencos;
                detalle.ClasificadorMovimiento = "999";
                detalle.UnidadOrganizacional = "999";
                detalle.FechaCarga = DateTime.Now;
                detalle.UsuarioResponsableCarga = "MISESF";
                detalle.Compania = "06000000";

                result.Add(detalle);

                qTipreg = l.Tipreg.Trim();
                qCorp = l.Corp.Value;
                qCia = l.Cia.Value;
                qOfic = l.Ofic;
                qAnodoc = l.Anodoc.Value;
                qTipdoc = l.Tipdoc.Trim();
                qNumori = l.Numori.Trim();
                qNumpag = l.Numpag;

                lineaValue++;
            }

            return result;
        }
        #endregion

        #region UD - SERVICIOS
        public List<Entidades.Version2.DBS.DBS_Detalle> Listar_UD_FAMA_AS400(List<Entidades.Version2.DBS.DBS_Detalle> lista)
        {
            return lista.Where(x =>
                x.Cencos.Trim() == "UD" &&
                x.Numori.StartsWith("FAMA") &&
                x.Numsec > 10 &&
                //x.Accion.Trim() == "00" &&
                x.Encode.Trim() != "GLOSA").ToList();
        }

        public List<Entidades.Version2.DBS.DBS_Detalle> Listar_UD_OT_AS400(List<Entidades.Version2.DBS.DBS_Detalle> lista)
        {
            return lista.Where(x =>
                x.Cencos.Trim() == "UD" &&
                x.Numori.StartsWith("OT") &&
                x.Numsec > 20 
                // && x.Accion.Trim() == "75"                
                ).ToList();
        }

        public List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> UD_ConvertTo_Spring(List<Entidades.Version2.DBS.DBS_Detalle> lista)
        {
            List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> result = new List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase>();

            string qTipreg = "-1";
            decimal qCorp = -1m;
            decimal qCia = -1m;
            decimal qOfic = -1m;
            decimal qAnodoc = -1m;
            string qTipdoc = "-1";
            string qNumori = "-1";
            int qNumpag = -1;

            int lineaValue = 0;

            foreach (Entidades.Version2.DBS.DBS_Detalle l in lista)
            {
                Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase detalle = new Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase();

                if (
                    qTipreg.Trim() != l.Tipreg.Trim() ||
                    qCorp != l.Corp.Value ||
                    qCia != l.Cia.Value ||
                    qOfic != l.Ofic ||
                    qAnodoc != l.Anodoc.Value ||
                    qTipdoc.Trim() != l.Tipdoc.Trim() ||
                    qNumori.Trim() != l.Numori.Trim() ||
                    qNumpag != l.Numpag)
                {
                    lineaValue = 1;
                }

                detalle.TipoComprobante = getTipoComprobante(l.Suntip.Trim());
                detalle.SerieComprobante = l.Sunpre.ToString().Trim();
                detalle.NumeroComprobante = l.Sunnum.ToString().Trim();
                detalle.Linea = lineaValue;
                detalle.Componente = !string.IsNullOrWhiteSpace(l.Ecode1) ? l.Ecode1.Trim().Substring(0, 4) : !string.IsNullOrWhiteSpace(l.Ecode2) ? l.Ecode2.Trim().Substring(0, 4) : !string.IsNullOrWhiteSpace(l.Ecode3) ? l.Ecode3.Trim().Substring(0, 4) : string.Empty;
                detalle.TipoComponente = "C";
                detalle.Cantidad = 1;
                detalle.Nombre = l.Linead.Trim();
                detalle.Sucursal = getSucursal(l.Ofic);
                detalle.Moneda = convertMoneda(l.Moneda);
                detalle.TipoCambio = l.Tipcam;
                detalle.PrecioUnitario = lineaValue == 1 ? l.Valaf16 : new decimal(0);
                detalle.MontoAfecto = lineaValue == 1 ? l.Valaf16 : new decimal(0);
                detalle.MontoImpuestoVentas = lineaValue == 1 ? l.Impor16 : new decimal(0);
                detalle.ClasificadorMovimiento = "999";
                detalle.UnidadOrganizacional = "999";
                detalle.ConceptoGasto = "999";
                detalle.EstadoCarga = "PE";
                detalle.Estado = "PE";
                detalle.CentroCosto = l.Cencos;
                detalle.FechaCarga = DateTime.Now;
                detalle.UsuarioResponsableCarga = "MISESF";
                detalle.Compania = "06000000";

                result.Add(detalle);

                qTipreg = l.Tipreg.Trim();
                qCorp = l.Corp.Value;
                qCia = l.Cia.Value;
                qOfic = l.Ofic;
                qAnodoc = l.Anodoc.Value;
                qTipdoc = l.Tipdoc.Trim();
                qNumori = l.Numori.Trim();
                qNumpag = l.Numpag;

                lineaValue++;
            }

            return result;
        }
        #endregion

        #region UC - REPUESTOS
        public List<Entidades.Version2.DBS.DBS_Detalle> Listar_UC_FACTURA_AS400(List<Entidades.Version2.DBS.DBS_Detalle> lista)
        {
            return lista.Where(x =>
                x.Cencos.Trim() == "UC" &&
                x.Accion.Trim() == "00" &&
                x.Importe > 0.00m).ToList();
        }

        public List<Entidades.Version2.DBS.DBS_Detalle> Listar_UC_NOTACREDITO_AS400(List<Entidades.Version2.DBS.DBS_Detalle> lista)
        {
            return lista.Where(x =>
                x.Cencos.Trim() == "UC" &&
                x.Numori.StartsWith("RPD") &&
                x.Numsec > 17 &&
                x.Accion.Trim() == "00").ToList();
        }

        public void Cargar_DBS_Detalle_LineAD(List<Entidades.Version2.DBS.DBS_Detalle> lista)
        {
            DBS_Detalle_LineAD_BLL dbs_Detalle_LineAD_BLL = new DBS_Detalle_LineAD_BLL();

            foreach (Entidades.Version2.DBS.DBS_Detalle l in lista)
            {
                dbs_Detalle_LineAD_BLL.Convertir(l);
            }
        }

        public List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> UC_FACTURA_ConverTo_Spring(List<Entidades.Version2.DBS.DBS_Detalle> lista)
        {
            List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> result = new List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase>();

            string qTipreg = "-1";
            decimal qCorp = -1m;
            decimal qCia = -1m;
            decimal qOfic = -1m;
            decimal qAnodoc = -1m;
            string qTipdoc = "-1";
            string qNumori = "-1";
            int qNumpag = -1;

            int lineaValue = 0;

            foreach (Entidades.Version2.DBS.DBS_Detalle l in lista)
            {
                Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase detalle = new Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase();                

                if (
                    qTipreg.Trim() != l.Tipreg.Trim() ||
                    qCorp != l.Corp.Value ||
                    qCia != l.Cia.Value ||
                    qOfic != l.Ofic ||
                    qAnodoc != l.Anodoc.Value ||
                    qTipdoc.Trim() != l.Tipdoc.Trim() ||
                    qNumori.Trim() != l.Numori.Trim() ||
                    qNumpag != l.Numpag)
                {
                    lineaValue = 1;                    
                }

                detalle.TipoComprobante = getTipoComprobante(l.Suntip.Trim());
                detalle.SerieComprobante = l.Sunpre.ToString().Trim();
                detalle.NumeroComprobante = l.Sunnum.ToString().Trim();
                detalle.Linea = lineaValue;
                detalle.TipoComponente = "C";
                detalle.Componente = l.Encode.Trim().Substring(0, 4);
                detalle.Nombre = string.Format("{0} {1}", l.DetalleLineAD.NroParte.Trim(), l.DetalleLineAD.Descripcion.Trim());
                detalle.Sucursal = getSucursal(l.Ofic);
                detalle.Cantidad = l.DetalleLineAD.Ped;
                detalle.Moneda = convertMoneda(l.Moneda);
                detalle.TipoCambio = l.Tipcam;
                //MODIFICAR EN BV COGER VALOR VENTA
                detalle.PrecioUnitario = l.Suntip.Trim() == "BO" ? Decimal.Round(l.DetalleLineAD.ValorVentaNetoUnitario / 1.18m, 2) : l.DetalleLineAD.ValorVentaNetoUnitario;
                detalle.MontoAfecto = l.Suntip.Trim() == "BO" ? l.DetalleLineAD.Ped * (Decimal.Round(l.DetalleLineAD.ValorVentaNetoUnitario / 1.18m, 2)) : l.DetalleLineAD.Ped * l.DetalleLineAD.ValorVentaNetoUnitario;
                detalle.MontoImpuestoVentas = l.Suntip.Trim() == "BO" ? Decimal.Round((l.DetalleLineAD.Ped * (Decimal.Round(l.DetalleLineAD.ValorVentaNetoUnitario / 1.18m, 2))) * 0.18m, 2) : Decimal.Round((l.DetalleLineAD.Ped * l.DetalleLineAD.ValorVentaNetoUnitario) * 0.18m, 2);
                detalle.ClasificadorMovimiento = "999";
                detalle.UnidadOrganizacional = "999";
                detalle.ConceptoGasto = "999";
                detalle.EstadoCarga = "PE";
                detalle.Estado = "PE";
                detalle.CentroCosto = l.Cencos;
                detalle.FechaCarga = DateTime.Now;
                detalle.UsuarioResponsableCarga = "MISESF";
                detalle.Compania = "06000000";

                result.Add(detalle);
                
                lineaValue++;

                qTipreg = l.Tipreg.Trim();
                qCorp = l.Corp.Value;
                qCia = l.Cia.Value;
                qOfic = l.Ofic;
                qAnodoc = l.Anodoc.Value;
                qTipdoc = l.Tipdoc.Trim(); 
                qNumori = l.Numori.Trim();
                qNumpag = l.Numpag;

                
            }

            return result;
        }

        public List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> UC_NOTACREDITO_ConverTo_Spring(List<Entidades.Version2.DBS.DBS_Detalle> lista)
        {
            List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> result = new List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase>();

            string qTipreg = "-1";
            decimal qCorp = -1m;
            decimal qCia = -1m;
            decimal qOfic = -1m;
            decimal qAnodoc = -1m;
            string qTipdoc = "-1";
            string qNumori = "-1";
            int qNumpag = -1;

            int lineaValue = 0;

            foreach (Entidades.Version2.DBS.DBS_Detalle l in lista)
            {
                Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase detalle = new Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase();

                if (
                    qTipreg.Trim() != l.Tipreg.Trim() ||
                    qCorp != l.Corp.Value ||
                    qCia != l.Cia.Value ||
                    qOfic != l.Ofic ||
                    qAnodoc != l.Anodoc.Value ||
                    qTipdoc.Trim() != l.Tipdoc.Trim() ||
                    qNumori.Trim() != l.Numori.Trim() ||
                    qNumpag != l.Numpag)
                {
                    lineaValue = 1;
                }

                detalle.TipoComprobante = getTipoComprobante(l.Suntip.Trim());
                detalle.SerieComprobante = l.Sunpre.ToString().Trim();
                detalle.NumeroComprobante = l.Sunnum.ToString().Trim();
                detalle.Linea = lineaValue;
                detalle.Componente = !string.IsNullOrWhiteSpace(l.Ecode1) ? l.Ecode1.Trim().Substring(0, 4) : !string.IsNullOrWhiteSpace(l.Ecode2) ? l.Ecode2.Trim().Substring(0, 4) : !string.IsNullOrWhiteSpace(l.Ecode3) ? l.Ecode3.Trim().Substring(0, 4) : string.Empty;
                detalle.TipoComponente = "C";
                detalle.Cantidad = 1;
                detalle.Nombre = l.Linead.Trim();
                detalle.Sucursal = getSucursal(l.Ofic);
                detalle.Moneda = convertMoneda(l.Moneda);
                detalle.TipoCambio = l.Tipcam;
                detalle.PrecioUnitario = lineaValue == 1 ? l.Valaf16 : new decimal(0);
                detalle.MontoAfecto = lineaValue == 1 ? l.Valaf16 : new decimal(0);
                detalle.MontoImpuestoVentas = lineaValue == 1 ? l.Impor16 : new decimal(0);
                detalle.ClasificadorMovimiento = "999";
                detalle.UnidadOrganizacional = "999";
                detalle.ConceptoGasto = "999";
                detalle.EstadoCarga = "PE";
                detalle.Estado = "PE";
                detalle.CentroCosto = l.Cencos;
                detalle.FechaCarga = DateTime.Now;
                detalle.UsuarioResponsableCarga = "MISESF";
                detalle.Compania = "06000000";

                result.Add(detalle);

                qTipreg = l.Tipreg.Trim();
                qCorp = l.Corp.Value;
                qCia = l.Cia.Value;
                qOfic = l.Ofic;
                qAnodoc = l.Anodoc.Value;
                qTipdoc = l.Tipdoc.Trim();
                qNumori = l.Numori.Trim();
                qNumpag = l.Numpag;

                lineaValue++;
            }

            return result;
        }

        #endregion
    }
}
